import auth from "@/plugins/auth";
import router, { constantRoutes, dynamicRoutes } from "@/router";
import { getRouters } from "@/api/menu";
import Layout from "@/layout/index";
import ParentView from "@/components/ParentView";
import InnerLink from "@/layout/components/InnerLink";
import $http from '@/utils/http'
const permission = {
  state: {
    routes: [],
    addRoutes: [],
    defaultRoutes: [],
    topbarRouters: [],
    sidebarRouters: [],
  },
  mutations: {
    SET_ROUTES: (state, routes) => {
      state.addRoutes = routes;
      state.routes = constantRoutes.concat(routes);
    },
    SET_DEFAULT_ROUTES: (state, routes) => {
      state.defaultRoutes = constantRoutes.concat(routes);
    },
    SET_TOPBAR_ROUTES: (state, routes) => {
      state.topbarRouters = routes;
    },
    SET_SIDEBAR_ROUTERS: (state, routes) => {
      state.sidebarRouters = routes;
    },
  },
  actions: {
    // 生成路由
    GenerateRoutes({ commit }) {
      return new Promise((resolve) => {
        // 向后端请求路由数据
        $http({
          url: "/menu/userMenu",
          method: "get",
        }).then(({ data }) => {
          if(data.code == -1){
            router.push('/login')
            return
          }
          console.log('ffffffffffffffffff',data.data)
          let routerData = data.data.pc
          const sdata = JSON.parse(JSON.stringify(routerData));
          const rdata = JSON.parse(JSON.stringify(routerData));
          const sidebarRoutes = filterAsyncRouter(sdata);
          const rewriteRoutes = filterAsyncRouter(rdata, false, true);
          const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
          rewriteRoutes.push({ path: "*", redirect: "/404", hidden: true });
          // router.addRoutes(asyncRoutes);
          commit("SET_ROUTES", rewriteRoutes);
          commit("SET_SIDEBAR_ROUTERS", constantRoutes.concat(sidebarRoutes));
          commit("SET_DEFAULT_ROUTES", sidebarRoutes);
          commit("SET_TOPBAR_ROUTES", sidebarRoutes);
          console.log('ffffffgggggg',sidebarRoutes,rewriteRoutes )
          resolve(rewriteRoutes);
        })
      });
    },
  },
};

// 遍历后台传来的路由字符串，转换为组件对象
function normalizePath(...segments) {
  return segments.join("/").replace(/\/+/g, "/");
}

function filterAsyncRouter(asyncRouterMap, lastRouter = null, type = false, visited = new Set()) {
  return asyncRouterMap.filter((route) => {
    const currentRoute = route.route || Math.random().toString(36).substring(7);
    const fullPath = normalizePath(lastRouter?.path || "", currentRoute);

    if (visited.has(fullPath)) {
      console.warn("⚠️ 检测到循环路径:", fullPath);
      return false;
    }
    visited.add(fullPath);

    route.meta = { title: route.menuName };
    // route.path = currentRoute.replace(/^\//, "");
    if (!lastRouter) {
      route.path = "/" + currentRoute.replace(/^\/+/, "");
    } else {
      route.path = currentRoute.replace(/^\/+/, "");
    }
    if (route.component === "Layout") {
      route.component = Layout;
    } else {
      route.component = loadView(route.component || 'error/404'); // fallback
    }
    if (route.hasChildren) {
      route.children = filterAsyncRouter(route.children, route, type, visited);
    } else {
      delete route.children;
      delete route.redirect;
    }
    return true;
  });
}

function filterChildren(childrenMap, lastRouter = false) {
  var children = [];
  childrenMap.forEach((el, index) => {
    if (el.children && el.children.length) {
      if (el.component === "ParentView" && !lastRouter) {
        el.children.forEach((c) => {
          c.path = el.path + "/" + c.path;
          if (c.children && c.children.length) {
            children = children.concat(filterChildren(c.children, c));
            return;
          }
          children.push(c);
        });
        return;
      }
    }
    if (lastRouter) {
      el.path = lastRouter.path + "/" + el.path;
      if (el.children && el.children.length) {
        children = children.concat(filterChildren(el.children, el));
        return;
      }
    }
    children = children.concat(el);
  });
  return children;
}

// 动态路由遍历，验证是否具备权限
export function filterDynamicRoutes(routes) {
  const res = [];
  routes.forEach((route) => {
    if (route.permissions) {
      if (auth.hasPermiOr(route.permissions)) {
        res.push(route);
      }
    } else if (route.roles) {
      if (auth.hasRoleOr(route.roles)) {
        res.push(route);
      }
    }
  });
  return res;
}

export const loadView = (view) => {
  if (process.env.NODE_ENV === "development") {
    return (resolve) => require([`@/views/${view}`], resolve);
  } else {
    // 使用 import 实现生产环境的路由懒加载
    return () => import(`@/views/${view}`);
  }
};

export default permission;
